package amtf

import (
	"encoding/json"
	"fmt"

	"server/global"
	"server/model/common/response"
	"server/model/system"
	"server/utils"

	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

var Auser system.SysUser
var Aapi = new(Sapi)

type Sapi struct {
	A组件 *S组件 `json:"-"`
}

func (a *Sapi) A增(c *gin.Context) {
	data, bytes := A观body(c, a.A组件)
	userID := utils.GetUserID(c)
	model, models, service := A解构组件(a.A组件)
	var err error
	switch data.(type) {
	case []any:
		// 前端传递为数组
		err = json.Unmarshal(bytes, &models)
		if err != nil {
			response.FailWithMessage(err.Error(), c)
			return
		}
	case map[string]any:
		// 前端传递为对象
		err = json.Unmarshal(bytes, &model)
		if err != nil {
			response.FailWithMessage(err.Error(), c)
			return
		}
		err = service.A增(model, userID)
		if err != nil {
			global.A_LOG.Error("新增失败!", zap.Error(err))
			response.FailWithMessage("新增失败:"+err.Error(), c)
			return
		}
	default:
		response.FailWithMessage("不支持的数据类型", c)
		return
	}
	// response.OkWithData(model, c)
	response.OkWithMessage("新增成功", c)
}

func (a *Sapi) A增ff(c *gin.Context) {
	// var model = a.A组件.Amodel
	model, _, service := A解构组件(a.A组件)
	// model = A实例转指针(model)
	err := c.ShouldBindJSON(model)
	if err != nil {
		response.FailWithMessage(err.Error(), c)
		return
	}
	userID := utils.GetUserID(c)
	记录创建用户(&userID, model)
	记录id否(c, model)
	err = service.A增(model, userID)

	组件名 := a.A组件.A名称
	// msg := fmt.Sprintf("新增 %s 成功!", 组件名)
	if err != nil {
		msg := fmt.Sprintf("新增 %s 失败!", 组件名)
		global.A_LOG.Error(msg, zap.Error(err))
		response.FailWithMessage(msg+err.Error(), c)
		return
	}

	// response.OkWithMessage(msg, c)
	response.OkWithData(model, c)
}

func (a *Sapi) A删(c *gin.Context) {
	_, _, service := A解构组件(a.A组件)
	// model = A实例转指针(model)
	// userID := utils.GetUserID(c)
	A予Auser(c)

	var ids []string
	id := c.Query("id")
	if id != "" {
		ids = append(ids, id)
		// fmt.Printf("删除一个 ids 👉 %+v\n", ids)
	} else {
		ids = c.QueryArray("ids[]")
		// fmt.Printf("删除多个 ids 👉 %+v\n", ids)
	}
	err := service.A删(ids)
	if err != nil {
		global.A_LOG.Error("删除失败!", zap.Error(err))
		response.FailWithMessage("删除失败:"+err.Error(), c)
		return
	}
	response.OkWithMessage("删除成功", c)
}

func (a *Sapi) A改(c *gin.Context) {
	data, bytes := A观body(c, a.A组件)
	userID := utils.GetUserID(c)
	model, models, service := A解构组件(a.A组件)
	var err error
	switch data.(type) {
	case []any:
		// 前端传递为数组
		err = json.Unmarshal(bytes, &models)
		if err != nil {
			response.FailWithMessage(err.Error(), c)
			return
		}
		// 记录更新用户多个(&userID, models)
		err = service.A改多个(models, userID)
		if err != nil {
			global.A_LOG.Error("更新失败!", zap.Error(err))
			response.FailWithMessage("更新失败:"+err.Error(), c)
			return
		}
	case map[string]any:
		// 前端传递为对象
		修改req := S修改req{}
		json.Unmarshal(bytes, &修改req)
		if 修改req.A动作 != "" {
			fmt.Printf("修改req 👉 %+v\n", 修改req)
			if err = service.流程动作(修改req.ID, userID, 修改req.A动作); err != nil {
				response.FailWithMessage("出错了:"+err.Error(), c)
				return
			}
		} else {
			err = json.Unmarshal(bytes, &model)
			if err != nil {
				response.FailWithMessage(err.Error(), c)
				return
			}
			// 记录更新用户(&userID, model)
			err = service.A改(model, userID)
			if err != nil {
				global.A_LOG.Error("更新失败!", zap.Error(err))
				response.FailWithMessage("更新失败:"+err.Error(), c)
				return
			}
		}
	default:
		response.FailWithMessage("不支持的数据类型", c)
		return
	}
	response.OkWithMessage("更新成功", c)
}

func (a *Sapi) A改作废(c *gin.Context) {
	userID := utils.GetUserID(c)
	model, models, service := A解构组件(a.A组件)
	if 是查设置否(c) {
		err := c.ShouldBindJSON(&models)
		if err != nil {
			response.FailWithMessage(err.Error(), c)
			return
		}
		fmt.Printf("models 👉 %+v\n", models)
		fmt.Printf("设置改 ing👇\n")
		记录更新用户多个(&userID, models)
		err = service.A改多个(models, userID)
		if err != nil {
			global.A_LOG.Error("更新失败!", zap.Error(err))
			response.FailWithMessage("更新失败:"+err.Error(), c)
			return
		}
	} else {
		err := c.ShouldBindJSON(&model)
		if err != nil {
			response.FailWithMessage(err.Error(), c)
			return
		}
		记录更新用户(&userID, model)
		err = service.A改(model, userID)
		if err != nil {
			global.A_LOG.Error("更新失败!", zap.Error(err))
			response.FailWithMessage("更新失败:"+err.Error(), c)
			return
		}
	}
	response.OkWithMessage("更新成功", c)
}

func (a *Sapi) A查(c *gin.Context) {
	_, _, service := A解构组件(a.A组件)
	id := c.Query("id")
	userID := utils.GetUserID(c)
	A予Auser(c)

	if id != "" {
		res, err := service.A查单个(id, userID)
		if 查询正常否(c, err) {
			response.OkWithData(res, c)
		}
		return
	}

	// 查多个👇
	if 是查设置否(c) {
		list, total, err := service.A查设置()
		if 查询正常否(c, err) {
			result := map[string]any{
				"list":  list,
				"total": total,
			}
			response.OkWithDetailed(result, "获取成功", c)
		}
	} else {
		// a.A组件 := a.A组件
		var req = a.A组件.A列表req
		err := c.ShouldBindQuery(&req)
		if err != nil {
			response.FailWithMessage(err.Error(), c)
			return
		}

		list, total, err := service.A查(req, userID)
		// fmt.Printf("list 👉 %+v\n", list)
		if 查询正常否(c, err) {
			response.OkWithDetailed(response.PageResult{
				List:     list,
				Total:    total,
				Page:     req.Page,
				PageSize: req.PageSize,
			}, "获取成功", c)
		}
		// if err = 仅自己观(c, &req); err != nil {
		// 	response.FailWithMessage(err.Error(), c)
		// } else {
		// 	list, total, err := service.A查(req)
		// 	// fmt.Printf("list 👉 %+v\n", list)
		// 	if 查询正常否(c, err) {
		// 		response.OkWithDetailed(response.PageResult{
		// 			List:     list,
		// 			Total:    total,
		// 			Page:     req.Page,
		// 			PageSize: req.PageSize,
		// 		}, "获取成功", c)
		// 	}
		// }
	}
}

func (a *Sapi) A成候选值(c *gin.Context) {
	_, _, service := A解构组件(a.A组件)
	关联显示字段 := c.Query("关联显示字段")
	res := service.A成候选值(关联显示字段)
	response.OkWithData(res, c)
}

func (a *Sapi) A查候选值集(c *gin.Context) {
	_, _, service := A解构组件(a.A组件)
	res, _ := service.A成候选值集()
	response.OkWithData(res, c)
}

func (a *Sapi) A查外键关联字段集(c *gin.Context) {
	_, _, service := A解构组件(a.A组件)
	var req = S关联表req{}
	err := c.ShouldBindQuery(&req)
	if 查询正常否(c, err) {
		res, _ := service.A成外键关联字段集(req)
		response.OkWithData(res, c)
	}
}

// func (a *Sapi) GetAPublic(c *gin.Context) {
// 	// 此接口不需要鉴权 示例为返回了一个固定的消息接口，一般本接口用于C端服务，需要自己实现业务逻辑
// 	Aservice.GetAPublic()
// 	response.OkWithDetailed(gin.H{"model": "不需要鉴权的接口信息"}, "获取成功", c)
// }
